本文主要说Android多点触控时出现pointerIndex out of range 的错误分析

Android多点触控时出现pointerIndex out of range 的错误分析

关于多点触控时出现pointerIndex out of range这个问题在网上查了好多资料,有以下几种情况:

  • 1.Android自身的问题,需要重新编译代码:这个没有验证过;

  • 2.将返回结果改为return false; :这是一个老外写的解决方法,本来以为能解决问题,结果….呵呵了,连单点的拖动都不能用了-.-!!

  • 3.没有处理异常:IllegalArgumentException

    这个靠点谱,因为控制台确实也报了这个错误,但一般文章都只贴了try{}catch代码,没写为什么,试了好多次,“一拖动”图片没了!

下面是具体的报错日志:

1
2
3
4
5
E/CrashReport: java.lang.IllegalArgumentException: pointerIndex out of range
at android.view.MotionEvent.nativeGetAxisValue(Native Method)
at android.view.MotionEvent.getX(MotionEvent.java:2080)
at androidx.viewpager.widget.ViewPager.onInterceptTouchEvent(ViewPager.java:2072)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2120)

这个问题通过重写viewpager 然后try()catch

1
2
3
4
5
6
7
8
### 问题分析
##### 这个问题的这个准确的位置是在event.getX(int)和event.getY(int)中会报错,因为你的触控点(那个int参数)可能越界了!我的问题是在两点触控后,有一个手指抬起的时候出现的,发现问题了没有!!!!当两点触控后抬起一个手指的时候只有一个触控点了,通过event.getX(1)的时候就越界了!所以只是try{}catch{}是可以解决问题,但是没解决根本问题的。
##### 这个问题的根本在于判断动作的时候可能没有做好case:MotionEvent.ACTION_POINTER_UP这个动作的处理,或没有调用super.onInterceptTouchEvent导致没有对pointerIndex 进行重新赋值。这个动作是在多点触控后,抬起部分手指(还有手指在屏幕上)的时候触发的。

### 问题解决
#### 1.处理好case:MotionEvent.ACTION_POINTER_UP的操作
#### 2.调用 super.onInterceptTouchEvent();更新poinerIndex状态
#### 3.重写报错的viewGroup 并try{}catch会出错的onIntercepterTouchevent()方法

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
try {
return super.onInterceptTouchEvent(ev);
} catch (IllegalArgumentException ex) {
ex.printStackTrace();
}
return false;
}
`